

'''
prompt 

我想用结构方程来分析一下电子健康素养对躯体健康得分的影响，以下是我的假设：
# 自变量（IV）：电子健康素养得分
# 中介变量（MV）：身体健康出现问题时上网搜索
# 因变量（DV）：躯体健康得分PCS
我的数据都是pandas dataframe的格式，一共有3列，很多行，每行是一组统计的数值，给我python代码

'''
from utils import column_letter_to_index
import pandas as pd
# from statsmodels.graphics.factorplots import path_diagram
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.stats.stattools import durbin_watson
from statsmodels.formula.api import ols
from statsmodels.sandbox.regression.predstd import wls_prediction_std

# 假设你的DataFrame名称为df，且列名分别为'EHL'（电子健康素养得分），'ISH'（身体健康出现问题时上网搜索），'PCS'（躯体健康得分）
data_path = '../data/raw_data/334份 按选项序号 汇总变量后.xlsx'
df = pd.read_excel(data_path)


##------------数据预处理--------------
# 电子健康素养得分
EHL_index = column_letter_to_index('AT')
# print(df.columns[EHL_index])
df_EHL = df.iloc[:, EHL_index]

# 身体健康出现问题时上网搜索
ISH_index = column_letter_to_index('AU')
# print(df.columns[ISH_index])
df_ISH = df.iloc[:, ISH_index]

# 躯体健康得分
PCS_index = column_letter_to_index('CG')
# print(df.columns[PCS_index])
df_PCS = df.iloc[:, PCS_index]

columns_to_extract = {
    df.columns[EHL_index]: 'EHL',
    df.columns[ISH_index]: 'ISH',
    df.columns[PCS_index]: 'PCS'
}
processed_df = df[list(columns_to_extract.keys())].rename(columns=columns_to_extract)


# SEM模型的建立，这里使用了OLS回归模型，因为SEM本质上是基于这些模型的集合
# 首先，定义影响中介变量的路径
mediator_model = ols('ISH ~ EHL', data=processed_df).fit()

# 然后，定义影响因变量的路径，包括中介变量的影响
outcome_model = ols('PCS ~ ISH + EHL', data=processed_df).fit()

# 输出模型结果
mediator_results = mediator_model.summary()
outcome_results = outcome_model.summary()

# 打印结果
print(mediator_results)
print(outcome_results)


'''
输出

                        OLS Regression Results
==============================================================================
Dep. Variable:                    ISH   R-squared:                       0.357
Model:                            OLS   Adj. R-squared:                  0.355
Method:                 Least Squares   F-statistic:                     184.0
Date:                Wed, 15 Nov 2023   Prob (F-statistic):           1.16e-33
Time:                        19:15:47   Log-Likelihood:                -460.87
No. Observations:                 334   AIC:                             925.7
Df Residuals:                     332   BIC:                             933.4
Df Model:                           1
Covariance Type:            nonrobust
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      1.4704      0.147     10.000      0.000       1.181       1.760
EHL            0.0807      0.006     13.566      0.000       0.069       0.092
==============================================================================
Omnibus:                        8.117   Durbin-Watson:                   1.727
Prob(Omnibus):                  0.017   Jarque-Bera (JB):                8.119
Skew:                          -0.330   Prob(JB):                       0.0173
Kurtosis:                       3.385   Cond. No.                         69.0
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
                            OLS Regression Results
==============================================================================
Dep. Variable:                    PCS   R-squared:                       0.110
Model:                            OLS   Adj. R-squared:                  0.105
Method:                 Least Squares   F-statistic:                     20.50
Date:                Wed, 15 Nov 2023   Prob (F-statistic):           4.03e-09
Time:                        19:15:47   Log-Likelihood:                -1230.1
No. Observations:                 334   AIC:                             2466.
Df Residuals:                     331   BIC:                             2478.
Df Model:                           2
Covariance Type:            nonrobust
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     32.0871      1.681     19.091      0.000      28.781      35.393
ISH            1.5179      0.550      2.760      0.006       0.436       2.600
EHL            0.2219      0.074      2.986      0.003       0.076       0.368
==============================================================================
Omnibus:                        6.147   Durbin-Watson:                   1.910
Prob(Omnibus):                  0.046   Jarque-Bera (JB):                6.277
Skew:                          -0.318   Prob(JB):                       0.0434
Kurtosis:                       2.785   Cond. No.                         80.4
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.


chatGPT分析


这里有两个回归模型的结果，我们来逐个解读。

第一个模型：ISH ~ EHL
这是一个线性回归模型，其中ISH（身体健康出现问题时上网搜索）作为因变量，EHL（电子健康素养得分）作为自变量。

R-squared (R²): 0.357，表明模型解释了35.7%的ISH的变异性。这是一个中等水平的拟合度。
Adjusted R-squared: 0.355，调整R²对自由度进行了调整，更适合比较不同数量自变量的模型。
F-statistic: 184.0，这个F统计量相对较大，并且其对应的P值非常小（1.16e-33），说明模型至少有一个自变量是显著的。
coef (EHL): 0.0807，每一单位EHL的增加，预计ISH会增加0.0807单位，这个效应是统计显著的（P值几乎为0）。
Intercept: 1.4704，表示当EHL为0时，ISH的预期值是1.4704。
第二个模型：PCS ~ ISH + EHL
这个模型稍微复杂一点，因为它包括两个自变量ISH和EHL，PCS（躯体健康得分PCS）是因变量。

R-squared (R²): 0.110，这个模型只解释了11.0%的PCS的变异性，这表明还有其他未包括在模型中的因素可能对PCS有影响。
Adjusted R-squared: 0.105，同样，调整后的R²也是相对较低的。
F-statistic: 20.50，这表明模型至少有一个自变量对PCS有显著影响。
coef (ISH): 1.5179，这表示ISH每增加一个单位，PCS预计会增加1.5179单位，这是显著的（P值为0.006）。
coef (EHL): 0.2219，这表示EHL每增加一个单位，PCS预计会增加0.2219单位，这也是显著的（P值为0.003）。
Intercept: 32.0871，表示当ISH和EHL都为0时，PCS的预期值是32.0871。
总体来说，电子健康素养（EHL）对身体健康出现问题时上网搜索（ISH）有正向影响，并且两者（EHL和ISH）都对躯体健康得分（PCS）有正向影响，但解释的变异性相对较低，表明可能还有其他因素影响着PCS的得分。

'''